package Dominio;

import java.util.ArrayList;
import java.util.List;

import hbt.PersistentObject;

import javax.persistence.*;

import dto.ClienteTO;
import dto.CondicionTO;
import dto.DomicilioTO;
import dto.TelefonoTO;
import Enums.TipoCliente;


@Entity
@Table(name="clientes")
public class Cliente extends PersistentObject{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	@Column(name="razonsocial",nullable=false, length=100)
	private String razonSocial;   
	
	@Embedded
	private Domicilio domicilio;
	
	@Column(name="cuil",nullable=false, length=11)
	private String cuil;
	
	@Column(name="tipoCliente")
	@Enumerated(EnumType.ORDINAL)
	private TipoCliente tipo;
	
	@OneToMany (cascade=CascadeType.ALL,fetch=FetchType.EAGER)
	@JoinColumn(name="idClienteTitular")
	private List<Telefono> telefonos; 

	@ManyToMany(cascade = {CascadeType.PERSIST})
	@JoinTable(name="cliente_condiciones",
		joinColumns=@JoinColumn(name="idCliente"),
		inverseJoinColumns=@JoinColumn(name="idCondicion"))
	private List<Condicion> condiciones;
	
	@OneToMany (cascade=CascadeType.ALL)
	@JoinColumn(name="idCliente")
	private List<Cotizacion> cotizaciones;
	
	
	@OneToMany (cascade=CascadeType.ALL)
	@JoinColumn(name="idCliente")
	private List<SolicitudDeCotizacion> solicitudesDeCotizacion;
	
	//@ManyToOne
	//@JoinColumn(name="oficinaDeVenta")
	//private ODV oficinaDeVenta;
	
	
	public String getCuil() {
		return cuil;
	}
	public void setCuil(String cuil) {
		this.cuil = cuil;
	}
	
	public int getIdCliente() {
		return id;
	}
	public void setIdCliente(int idCliente) {
		this.id = idCliente;
	}
	public String getRazonSocial() {
		return razonSocial;
	}
	public void setRazonSocial(String razonSocial) {
		this.razonSocial = razonSocial;
	}
	public Domicilio getDomicilio() {
		return domicilio;
	}
	public void setDomicilio(Domicilio domicilio) {
		this.domicilio = domicilio;
	}

	public TipoCliente getTipo() {
		return tipo;
	}
	public void setTipo(TipoCliente tipo) {
		this.tipo = tipo;
	}
	
	public List<Telefono> getTelefonos() {
		return telefonos;
	}
	public void setTelefonos(List<Telefono> telefonos) {
		this.telefonos = telefonos;
	}
	
	public List<Condicion> getCondiciones() {
		return condiciones;
	}
	public void setCondiciones(List<Condicion> condiciones) {
		this.condiciones = condiciones;
	}
	
	
	public List<Cotizacion> getCotizaciones() {
		return cotizaciones;
	}
	public void setCotizaciones(List<Cotizacion> cotizaciones) {
		this.cotizaciones = cotizaciones;
	}
	
	
	public List<SolicitudDeCotizacion> getSolicitudesDeCotizacion() {
		return solicitudesDeCotizacion;
	}
	public void setSolicitudesDeCotizacion(
			List<SolicitudDeCotizacion> solicitudesDeCotizacion) {
		this.solicitudesDeCotizacion = solicitudesDeCotizacion;
	}
	
	public ClienteTO toTO() 
	{
		List<TelefonoTO> tel = new ArrayList<TelefonoTO>();
		DomicilioTO dTO  = new DomicilioTO();
		if(this.domicilio!= null){
			dTO = this.domicilio.toTO();
		}
		if(this.telefonos != null)
		for(Telefono t : this.telefonos){
			tel.add(t.toTO());
		}
		List<CondicionTO> cond = new ArrayList<CondicionTO>();
		/*
		for(Condicion c : this.condiciones){
			cond.add(c.toTO());
		}
		List<CotizacionTO> cot = new ArrayList<CotizacionTO>();
		if(!this.cotizaciones.equals(null))
		for(Cotizacion c : this.cotizaciones){
			cot.add(c.toTO());
		}
		List<SolicitudDeCotizacionTO> scot = new ArrayList<SolicitudDeCotizacionTO>();
		
		for(SolicitudDeCotizacion c : this.solicitudesDeCotizacion){
			scot.add(c.toTO());
		}*/
		String tipo = "";
		if(this.tipo != null)
			tipo = this.tipo.name();
		ClienteTO c = new ClienteTO(this.razonSocial,dTO, this.cuil,tipo, tel,cond, null, null);
		return c;
	}
}
